"""
图像处理工具函数 (utils/image_utils.py)

提供 Meme 图片生成相关的功能。
"""
from PIL import Image, ImageDraw, ImageFont
import requests
from io import BytesIO
import uuid
import os
import logging

# 配置日志记录器
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# 字体文件路径 (需要根据实际环境配置)
# FONT_PATH = "Impact.ttf"
# FONT_PATH = "/Library/Fonts/Impact.ttf" # macOS
FONT_PATH = "/usr/share/fonts/truetype/msttcorefonts/Impact.ttf" # Linux (需安装 msttcorefonts)
# FONT_PATH = "C:/Windows/Fonts/impact.ttf" # Windows

def generate_meme(template_url, top_text, bottom_text, output_folder):
    """
    根据模板 URL 和文字生成 Meme 图片。

    Args:
        template_url: 模板图片 URL。
        top_text: 顶部文字。
        bottom_text: 底部文字。
        output_folder: 输出图片的目标文件夹。

    Returns:
        str or None: 生成的文件名 (不含路径)，失败则返回 None。
    """
    try:
        # 下载模板图片
        logger.info(f"正在从 {template_url} 下载模板...")
        response = requests.get(template_url, timeout=10)
        response.raise_for_status()
        
        # 打开图片
        img = Image.open(BytesIO(response.content)).convert("RGBA")
        width, height = img.size
        logger.info(f"模板图片尺寸: {width}x{height}")
        
        # 创建绘图对象
        draw = ImageDraw.Draw(img)
        
        # 加载字体 (尝试 Impact，失败则用默认)
        font_size = min(int(height / 8), 100)
        font = None
        try:
            font = ImageFont.truetype(FONT_PATH, font_size)
            logger.info(f"成功加载字体 {FONT_PATH}, 大小 {font_size}")
        except IOError:
            logger.warning(f"字体 {FONT_PATH} 未找到，尝试使用默认字体...")
            try:
                font = ImageFont.load_default()
                logger.info("已加载默认字体")
            except Exception as e:
                 logger.error(f"加载默认字体也失败: {e}")
                 return None
        
        # 添加顶部文字
        if top_text:
            logger.info(f"添加顶部文字: {top_text}")
            bbox = draw.textbbox((0, 0), top_text, font=font)
            text_width = bbox[2] - bbox[0]
            text_x = (width - text_width) / 2
            text_y = 10 
            draw_text_with_outline(draw, (text_x, text_y), top_text, font)
        
        # 添加底部文字
        if bottom_text:
            logger.info(f"添加底部文字: {bottom_text}")
            bbox = draw.textbbox((0, 0), bottom_text, font=font)
            text_width = bbox[2] - bbox[0]
            text_height = bbox[3] - bbox[1]
            text_x = (width - text_width) / 2
            text_y = height - text_height - 15
            draw_text_with_outline(draw, (text_x, text_y), bottom_text, font)
        
        # 生成文件名并保存
        filename = f"{uuid.uuid4()}.png" # 保存为 PNG
        filepath = os.path.join(output_folder, filename)
        img.save(filepath, "PNG")
        logger.info(f"Meme 图片已保存到: {filepath}")
        return filename
    
    except requests.exceptions.RequestException as e:
        logger.error(f"下载模板图片时出错 ({template_url}): {e}")
        return None
    except IOError as e:
        logger.error(f"打开或处理图片时出错 ({template_url}): {e}")
        return None
    except Exception as e:
        logger.error(f"生成 Meme 时发生未知错误: {e}", exc_info=True)
        return None

def draw_text_with_outline(draw, position, text, font, outline_color="black", text_color="white", outline_width=2):
    """
    绘制带描边的文字。

    Args:
        draw: ImageDraw 对象。
        position: 文字位置 (x, y)。
        text: 文字内容。
        font: 字体对象。
        outline_color: 描边颜色。
        text_color: 文字颜色。
        outline_width: 描边宽度。
    """
    x, y = position
    # 绘制描边
    for dx in range(-outline_width, outline_width + 1):
        for dy in range(-outline_width, outline_width + 1):
            if dx != 0 or dy != 0:
                draw.text((x + dx, y + dy), text, font=font, fill=outline_color)
    # 绘制文字本身
    draw.text((x, y), text, font=font, fill=text_color) 